package com.damBowling.mybolos;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;

import models.Logro;
import models.Socio;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.entity.BufferedHttpEntity;
import org.apache.http.impl.client.DefaultHttpClient;

import android.app.Activity;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.Window;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.Gallery;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

public class VisorDeLogrosActivity extends Activity {

	private Integer usuarioId;
	private TextView usuarioTextView;
	private List<Logro> logrosSocio;
	private List<Logro> logros;
	private TextView nombreLogroTextView;
	private TextView descripcionLogroTextView;
	private TextView cantidadLogros;
	private TextView puntuacionLogros;
	private Button backButton;
	private Gallery galeria;
	SharedPreferences prefs;
	String nomLogro;
	int cantidadLogrosTotales;
	int cantidadLogrosGanados;

	boolean sdDisponible = false;
	boolean sdAccesoEscritura = false;

	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		requestWindowFeature(Window.FEATURE_NO_TITLE);
		setContentView(R.layout.visordelogros);
		descripcionLogroTextView = (TextView) findViewById(R.id.descripcionTextview);
		nombreLogroTextView = (TextView) findViewById(R.id.nombreLogroTextView);
		usuarioTextView = (TextView) findViewById(R.id.usuariotextview);
		cantidadLogros = (TextView) findViewById(R.id.textView1);
		puntuacionLogros=(TextView)findViewById(R.id.puntuacionTextView);
		galeria = (Gallery) findViewById(R.id.gallery1);
		backButton = (Button)findViewById(R.id.backBtn);
		nombreLogroTextView.setText("");
		descripcionLogroTextView.setText("");
		
		backButton.setOnClickListener(new OnClickListener() {
			
			public void onClick(View v) {
				finish();				
			}
		});
		//Obtener el id del usuario
		 prefs = getSharedPreferences("ajustes", Context.MODE_PRIVATE);
		 usuarioId = Integer.valueOf(prefs.getString("id", "0"));
		
		
		BoleraWebserviceInvoker boleraWebserviceInvoker = new BoleraWebserviceInvoker(getApplicationContext().getResources());
		
		logrosSocio = boleraWebserviceInvoker.recuperaLogrosSocio(usuarioId);
		logros = boleraWebserviceInvoker.recuperaTodosLosLogros();
		System.out.println("logros:"+logros.size());
		//Comprobamos que hayan logros:
		if(logros != null){
			
		if(logros.size() != 0){
		descargarImagenesLogros();

		//Con esto mostramos el nombre del socio
		Socio socio=boleraWebserviceInvoker.getDatosSocio(usuarioId);
		
		usuarioTextView.setText(" " + socio.getNombre());
		if (logrosSocio.size() >0){
		Logro logro = logrosSocio.get(0);
		//Con esto mostramos la cantidad de logros del socio sobre el total de logros
		cantidadLogros.setText("Logros:" + " " + logro.getCantidadLogrosSocio()
				+ "/" + logro.getCantidadLogrosTotales());
		}else{
			cantidadLogros.setText("Logros:" + "  0/" + logros.size());
		}
		//Con esto mostramos la puntuacion del socio:
		int cuentaPuntuacion = 0;
		for (Logro logro1 : logrosSocio) {
			cuentaPuntuacion = cuentaPuntuacion + logro1.getPuntuacion();
		}
		puntuacionLogros.setText("Puntacion total: " + cuentaPuntuacion);
		
		//Aqui configuramos el onClick de la galeria
		galeria.setAdapter(new ImageAdapter(this));
		galeria.setOnItemClickListener(new OnItemClickListener() {

			public void onItemClick(AdapterView<?> parent, View v,
					int position, long id) {
				nombreLogroTextView.setText(logros.get(position).getNombre());
				descripcionLogroTextView
						.setText(logros.get(position).getDescripcion() + " = "
								+ logros.get(position).getPuntuacion() + " "
								+ "puntos");
			}

		});
		}else{
			Context context = getApplicationContext();
			CharSequence text = "No hay logros disponibles aun";
			int duration = Toast.LENGTH_SHORT;

			Toast toast = Toast.makeText(context, text, duration);
			toast.show();
			finish();
		}}else{
			Context context = getApplicationContext();
			CharSequence text = "No hay logros disponibles aun";
			int duration = Toast.LENGTH_SHORT;

			Toast toast = Toast.makeText(context, text, duration);
			toast.show();
			finish();
		}
	}
//Aqui le decimos que si es un logro del socio muestre la imagen que 
//descargara con descargarImagen, si no que muestre al cando en R
	private void descargarImagenesLogros() {
		for (Logro logro : logrosSocio) {
			String logroURL = logro.getImagenURL();
			logro.setImagen(descargarImagen(logroURL));
		}
		for (Logro logro : logros) {
			Bitmap bitmap = BitmapFactory.decodeResource(getResources(),
					R.drawable.logro_bloqueado);
			logro.setImagen(bitmap);
		}

	}
	final Handler noConexion = new Handler() {
		/*
		 * (non-Javadoc)
		 * 
		 * @see android.os.Handler#handleMessage(android.os.Message) Este m�todo
		 * handler crea un Toast cuando es llamado por un fallo en internet
		 */
		@Override
		public void handleMessage(Message msg0) {
			Toast.makeText(getApplicationContext(),
					"Hay un problema con la conexi�n a internet",
					Toast.LENGTH_SHORT).show();
		}
	};

	//Aqui tenemos al metodo que accedemos a partir de descargarImagenesLogros()
	//y que llama al metodo buscarImagenEnTarjeta que busca la imagen en la tarjeta
	//y si no esta la crea con el metodo guardaImagenEnTarjeta(), si esta simplemente la coge de ah�
	public Bitmap descargarImagen(String url) {
		Bitmap bm=null;
		String imageUrl=getApplicationContext().getResources().getString(R.string.server)+"api/"+url;
		bm=buscarImagenEnTarjeta(imageUrl);
		if (bm != null){
			return bm;
		}
		HttpGet httpRequest = null;
		System.out.println("img:"+url);
		httpRequest = new HttpGet(imageUrl);
		HttpClient httpclient = new DefaultHttpClient();
		HttpResponse response;
		try {
			response = (HttpResponse) httpclient.execute(httpRequest);
			HttpEntity entity = response.getEntity();
			BufferedHttpEntity bufferedHttpEntity = new BufferedHttpEntity(
					entity);
			InputStream instream = bufferedHttpEntity.getContent();
			bm = BitmapFactory.decodeStream(instream);
			guardaImagenEnTarjeta(url,bm);
			return bm;
		} catch (ClientProtocolException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return null;
	}

	private void guardaImagenEnTarjeta(String url, Bitmap bm) {
		  File sdCard = Environment.getExternalStorageDirectory();
		  File directory = new File(sdCard.getAbsolutePath() + "/MyBolosLogros");
		  if (!directory.exists()){
			  directory.mkdir();
		  }
		  File file = new File(directory, url);
		  try {
			file.createNewFile();
		} catch (IOException e1) {
			e1.printStackTrace();
		}
		  try {
			FileOutputStream out=new FileOutputStream(file);
			bm.compress(Bitmap.CompressFormat.PNG, 90, out);
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}
   }

	

	private Bitmap buscarImagenEnTarjeta(String url) {
		File sdCard = Environment.getExternalStorageDirectory();
		String nombreImagen=url.substring(url.lastIndexOf('/'),url.length());
		File imagenFile=new File(sdCard.getAbsolutePath() + "/MyBolosLogros"+"/"+nombreImagen);
		if (!imagenFile.exists()){
			return null;
		}
		return BitmapFactory.decodeFile(imagenFile.getAbsolutePath());
	}
//Este es el ImageAdapter de la galeria, que tiene sus propios gets a los que 
	//les pasamos el tama�o de la galeria, los objetos que la rellenaran y todos los parametros necesarios para que funcione
	public class ImageAdapter extends BaseAdapter {
		private Context context;
		private int itemBackground;

		public ImageAdapter(Context c) {
			context = c;
			TypedArray a = obtainStyledAttributes(R.styleable.Galeria);
			itemBackground = a.getResourceId(
					R.styleable.Galeria_android_galleryItemBackground, 0);

		}

		public int getCount() {
			return logros.size();
		}

		public Object getItem(int position) {
			return logros.get(position);
		}

		public long getItemId(int position) {
			return position;
		}

		public View getView(int position, View convertView, ViewGroup parent) {
			ImageView imageView = new ImageView(context);
			Bitmap imagen = null;
			Logro logro = logros.get(position);
			imagen = logro.getImagen();
			for (Logro logroSocio : logrosSocio) {
				if (logro.getId() == logroSocio.getId()) {
					imagen = logroSocio.getImagen();
				}
			}

			imageView.setImageBitmap(imagen);
			imageView.setScaleType(ImageView.ScaleType.FIT_XY);
			imageView.setLayoutParams(new Gallery.LayoutParams(150, 120));
			imageView.setBackgroundResource(itemBackground);
			return imageView;
		}
	}

}
